package ahblue.cn.tanzi.data.source;

import java.util.List;
import java.util.Map;

import ahblue.cn.tanzi.data.HomeArticle;
import ahblue.cn.tanzi.model.SearchWord;
import ahblue.cn.tanzi.model.VersionInfo;
import ahblue.cn.tanzi.model.circle.Circle;
import ahblue.cn.tanzi.model.circle.CircleArticleItem;
import ahblue.cn.tanzi.model.circle.CircleCategory;
import ahblue.cn.tanzi.model.circle.CircleDetailCenter;
import ahblue.cn.tanzi.model.circle.CircleDetailTop;
import ahblue.cn.tanzi.model.circle.CircleDynamicItem;
import ahblue.cn.tanzi.model.circle.DynamicComment;
import ahblue.cn.tanzi.model.circle.DynamicFabulou;
import ahblue.cn.tanzi.model.circle.ShotDynamicDetail;
import ahblue.cn.tanzi.model.collect.CollectModel;
import ahblue.cn.tanzi.model.home.ArticleCategory;
import ahblue.cn.tanzi.data.Result;
import ahblue.cn.tanzi.model.home.ArticleDetail;
import ahblue.cn.tanzi.model.home.ArticlesForCategory;
import ahblue.cn.tanzi.model.home.BannerAd;
import ahblue.cn.tanzi.model.home.HomeModel;
import ahblue.cn.tanzi.model.home.NewsForCategory;
import ahblue.cn.tanzi.model.home.SpecalModel;
import ahblue.cn.tanzi.model.home.VideoCommentlModel;
import ahblue.cn.tanzi.model.home.VideoDetailModel;
import ahblue.cn.tanzi.model.home.VideoLableModel;
import ahblue.cn.tanzi.model.home.VideoModel;
import ahblue.cn.tanzi.model.user.BankListModel;
import ahblue.cn.tanzi.model.user.CodeModel;
import ahblue.cn.tanzi.model.user.CostModel;
import ahblue.cn.tanzi.model.user.KeChengModel;
import ahblue.cn.tanzi.model.user.LoginResultModel;
import ahblue.cn.tanzi.model.user.LookHisToryModel;
import ahblue.cn.tanzi.model.user.MemberInfo;
import ahblue.cn.tanzi.model.user.PackageModel;
import ahblue.cn.tanzi.model.user.ProfitModel;
import ahblue.cn.tanzi.model.user.TeamModel;
import ahblue.cn.tanzi.model.user.TieziModel;
import ahblue.cn.tanzi.model.user.UserModel;
import ahblue.cn.tanzi.ui.msg.model.FriendModel;
import ahblue.cn.tanzi.ui.person.pay.WAPayNode;
import io.reactivex.Observable;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.Part;
import retrofit2.http.PartMap;
import retrofit2.http.Query;
import retrofit2.http.QueryMap;

public interface ApiService {

    /*----------------------------------------------------------------------------------------------
     * 与首页相关的接口
     *--------------------------------------------------------------------------------------------*/

    /**
     * 获取首页顶部的广告条。
     *
     * @return 广告列表
     */
    @GET("big_shot_index_top")
    Observable<Result<List<BannerAd>>> getBigShotIndexTop();

    /**
     * 获取首页的列表数据。
     *
     * @return 广告列表
     */
    @GET("big_shot_index_list")
    Observable<Result<List<HomeArticle>>> getBigShotIndexList(
            @Query("page") int page,
            @Query("page_count") int pageCount
    );

    /**
     * 圈子详情-圈子文章
     * @return 圈子详情-圈子文章
     */
    @GET("big_shot_circle_details_article")
    Observable<Result<List<CircleArticleItem>>> getCircleDetailsArticle(
            @Query("id") int categoryId,
            @Query("page") int page,
            @Query("page_count") int pageCount
    );
    /**
     * 文章菜单获取
     * @return 菜单列表
     */
    @GET("big_shot_article_category")
    Observable<Result<List<ArticleCategory>>> getArticleCategory();

    /**
     * 获取对应文章列表(及专题列表)。
     * @param categoryId 文章类目id（获取专题时不用传）
     * @param page 页码
     * @param pageCount 一页数量
     * @param isSpecial 是否专题（获取专题文章时才传1）不是传0
     * @param name 模糊搜索词
     * @return 文章列表
     */
    @GET("big_shot_article_list")
    Observable<Result<List<ArticlesForCategory>>> getBigShotArticleList(
            @Query("category_id") int categoryId,
            @Query("page") int page,
            @Query("page_count") int pageCount,
            @Query("is_special") int isSpecial,
            @Query("name") String name
    );

    /**
     * 获取首页一级菜单
     * @return 一级菜单
     */
    @GET("big_shot_article_category")
    Observable<Result<List<HomeModel>>> getBigShotArticleCategory();

    /**
     * 获取首页一级菜单
     * @return 一级菜单
     */
    @GET("article/article/get_category_list")
    Observable<Result<List<ArticleCategory>>> getCategoryList(
            @Query("p_id") int p_id
    );


    /**
     * 圈子详情里面获取圈子介绍
     * @param id 圈子id
     * @return
     */
    @GET("big_shot_circle_introduce")
    Observable<Result<String>> getBigShotCircleIntroduce(
            @Query("id") int id
    );

    /**
     * 3、文章详情
     * @param articleId 文章id
     * @param token 登录接口返回的token字段
     * @return 文章详情
     */
    @GET("big_shot_article_detail")
    Observable<Result<ArticleDetail>> getBigShotArticleDetail(
            @Query("id") int articleId,
            @Query("token") String token
    );

    /**
     * 文章点赞和收藏。
     * @param articleId 文章id
     * @param operation 收藏或者点赞, 收藏collection，点赞fabulous
     * @param token 登录接口返回的token字段
     * @return 操作状态
     */
    @FormUrlEncoded
    @POST("big_shot_article_collection")
    Observable<Result> getBigShotArticleCollection(
            @Field("id") int articleId,
            @Field("operation") String operation,
            @Field("token") String token
    );

    /**
     * 5、评论通用接口
     * @param articleId 文章(动态)id
     * @param commentType 评论类型, comment_type=1（评论文章）comment_type=2（评论课程）
     *                    comment_type=3（评论视频）comment_type=5（动态评论）
     * @param content 评论内容
     * @param token 登录接口返回的token字段
     * @return 操作状态
     */
    @FormUrlEncoded
    @POST("big_shot_article_comment")
    Observable<Result> addBigShotArticleComment(
            @Field("id") int articleId,
            @Field("comment_type") int commentType,
            @Field("content") String content,
            @Field("token") String token
    );

    /**
     * 7、文章取消点赞
     * @param articleId 文章(动态)id
     * @param token 登录接口返回的token字段
     * @return 操作状态
     */
    @FormUrlEncoded
    @POST("big_shot_article_delete_fabulous")
    Observable<Result> delBigShotArticleDeleteFabulous(
            @Field("id") int articleId,
            @Field("token") String token
    );

    /**
     * 热门搜索
     * @return 热门搜索单词
     */
    @GET("big_shot_hot_word")
    Observable<Result<List<SearchWord>>> getBigShotHotWord();

    /**
     * 3、添加搜索我的历史标签
     * @param token 登录接口返回的token字段
     * @param name 搜索词
     * @return 操作状态
     */
    @FormUrlEncoded
    @POST("big_shot_add_word")
    Observable<Result> addBigShotAddWord(
            @Field("token") String token,
            @Field("name") String name
    );

    /**
     * 4、历史搜索词列表
     * @param token 登录接口返回的token字段
     * @return 操作状态
     */
    @GET("big_shot_history_list")
    Observable<Result<List<SearchWord>>> getBigShotHistoryList(
            @Query("token") String token
    );

    /**
     * 5、清楚我的搜索历史
     * @param token 登录接口返回的token字段
     * @return 操作状态
     */
    @GET("big_shot_history_delete")
    Observable<Result> getBigShotHistoryDelete(
            @Query("token") String token
    );

    /*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/






    /*----------------------------------------------------------------------------------------------
     * 与圈子相关的接口
     *--------------------------------------------------------------------------------------------*/
    @GET("big_shot_circle_top")
    Observable<Result<List<Circle>>> getCircleTop();

    @GET("big_shot_user_dynamic")
    Observable<Result<List<CircleDynamicItem>>> getBigShotUserDynamic(
            @Query("page") int page,
            @Query("page_count") int pageCount,
            @Query("name") String name,
            @Query("token") String token
    );

    /**
     * 3、动态详情
     * @param shotId 动态id
     * @return 动态详情的内容
     */
    @GET("big_shot_dynamic_details")
    Observable<Result<ShotDynamicDetail>> getShotDynamicDetails(@Query("id") int shotId);

    /**
     * 4、动态点赞列表
     * @param page 页码
     * @param pageCount 一页数量
     * @param shotId 动态id
     * @return 动态点赞列表
     */
    @GET("big_shot_dynamic_fabulous")
    Observable<Result<List<DynamicFabulou>>> getBigShotDynamicFabulous(
            @Query("page") int page,
            @Query("page_count") int pageCount,
            @Query("id") int shotId
    );

    /**
     * 5、动态评论列表
     * @param page 页码
     * @param pageCount 一页数量
     * @param shotId 动态id
     * @return 动态评论列表
     */
    @GET("big_shot_dynamic_comment_list")
    Observable<Result<List<DynamicComment>>> getBigShotDynamicCommentList(
            @Query("page") int page,
            @Query("page_count") int pageCount,
            @Query("id") int shotId
    );



    /**
     * 我的圈子-三个推荐圈子。
     * @param page 页码
     * @param pageCount 一页数量
     * @return 三个推荐圈子
     */
    @GET("big_shot_circle_three_circle")
    Observable<Result<List<Circle>>> getBigShotCircleThreeCircle(
            @Query("page") int page,
            @Query("page_count") int pageCount
    );

    /**
     * 圈子详情-顶部
     * @param circleId 圈子id
     * @return 圈子顶部详情
     */
    @GET("big_shot_circle_details_top")
    Observable<Result<CircleDetailTop>> getBigShotCircleDetailsTop(
            @Query("id") int circleId
    );

    /**
     * 圈子详情-顶部
     * @param circleId 圈子id
     * @return 圈子顶部详情
     */
    @GET("big_shot_circle_detail_center")
    Observable<Result<CircleDetailCenter>> getBigShotCircleDetailsCenter(
            @Query("id") int circleId
    );

    /**
     * 6、圈子标签获取
     * @return 圈子标签
     */
    @GET("big_shot_circle_category")
    Observable<Result<List<CircleCategory>>> getBigShotCircleCategory();

    /**
     * 7、对应圈子列表
     *
     * @param page 页码
     * @param pageCount 一页数量
     * @param categoryId 标签id
     * @param name 模糊搜索词
     *
     * @return 圈子列表
     */
    @GET("big_shot_category_circle")
    Observable<Result<List<Circle>>> getBigShotCategoryCircle(
            @Query("page") int page,
            @Query("page_count") int pageCount,
            @Query("category_id") int categoryId,
            @Query("name") String name
    );

    /**
     * 7、对应圈子列表--所有
     *
     * @param page 页码
     * @param pageCount 一页数量
     * @param name 模糊搜索词
     *
     * @return 圈子列表
     */
    @GET("big_shot_category_circle")
    Observable<Result<List<Circle>>> getAllBigShotCategoryCircle(
            @Query("page") int page,
            @Query("page_count") int pageCount,
            @Query("name") String name
    );

    /**
     * 11、圈子详情-圈子动态
     *
     * @param circleId 圈子id
     * @param page 页码
     * @param pageCount 一页数量
     *
     * @return 圈子动态列表
     */
    @GET("big_shot_circle_details_dynamic")
    Observable<Result<List<CircleDynamicItem>>> getBigShotCircleDetailsDynamic(
            @Query("id") int circleId,
            @Query("page") int page,
            @Query("page_count") int pageCount
    );

    /**
     * 14、我的圈子-加入圈子
     * @param token 用戶登陸后獲取到的的token
     * @param circleId 圈子id
     *
     * @return 操作后的狀態，成功或者失敗
     */
    @FormUrlEncoded
    @POST("big_shot_comment_info_circle")
    Observable<Result> getBigShotCommentInfoCircle(
            @Field("token") String token,
            @Field("id") int circleId
    );

    /**
     * 15、我的圈子列表
     * @param token 用户登录后获取的token
     * @return 我的圈子列表
     */
    @GET("big_shot_comment_my_circle")
    Observable<Result<List<Circle>>> getBigShotCommentMyCircle(
            @Query("token") String token
    );

    /**
     * 16、动态发布
     * @param token 用户登录后获取的token
     * @param content 内容, 必传
     * @param circle_id 圈子id, 例如,12,3,4,5,(前后两个,必须有)（必传）
     * @param is_friend 是否朋友可见, 0不是1是（必传）
     * @param file_name 文件name, 多文件file[]
     * @return 操作后的狀態，成功或者失敗
     */
    @Multipart
    @POST("big_shot_circle_send_dynamic")
    Observable<Result> addBigShotCircleSendDynamic(
            @Part("token") RequestBody token,
            @Part("content") RequestBody content,
            @Part("circle_id") RequestBody circle_id,
            @Part("is_friend") RequestBody is_friend,
            @PartMap() Map<String, RequestBody> file_name,
            @Part MultipartBody.Part file_movie
    );

    /**
     * 17、圈子排行
     * @return 圈子列表
     */
    @GET("big_shot_circle_circle_sort")
    Observable<Result<List<Circle>>> getBigShotCircleCircleSort();

    /**
     * 18、动态取消点赞
     * @param id 动态id
     * @param token 登录接口返回的token字段
     * @return 操作结果
     */
    @FormUrlEncoded
    @POST("big_shot_article_delete_dynamic_fabulous")
    Observable<Result> deleteBigShotArticleDeleteDynamicFabulous(
            @Field("id") int id,
            @Field("token") String token
    );

    /**
     * 19、动态点赞
     * @param id 动态id
     * @param token 登录接口返回的token字段
     * @return 操作结果
     */
    @FormUrlEncoded
    @POST("big_shot_dynamic_to_fabulous")
    Observable<Result> addBigShotDynamicToFabulous(
            @Field("id") int id,
            @Field("token") String token
    );

    /*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/


    /**
     * 个人详情接口（系统中点击其他的用户头像进入）
     * @param token 用户登录后获取的token
     * @param memberId 用户id
     * @return
     */
    @FormUrlEncoded
    @POST("index.php/member/member_index/member_info")
    Observable<Result<MemberInfo>> getMemberInfo(@Field("token") String token, @Field("member_id") long memberId);





    /**
     * 获取专题列表数据
     * @return
     */
    @GET("big_shot_curriculum_special_list")
    Observable<Result<List<SpecalModel>>> getSpecalList(@Query("page") String page, @Query("page_count") String page_count);

    /**
     * 密码登陆
     * @return
     */

    @POST("index.php/member/member_login/login")
    Observable<Result<LoginResultModel>> LoginWithPwd(@QueryMap Map<String, String> params);

    @POST("index.php/member/member_login/wx_auth_login")
    Observable<Result<LoginResultModel>> WXLogin(@QueryMap Map<String, String> params);

    @POST("index.php/member/member_index/set_invite_code")
    Observable<Result<LoginResultModel>> setCode(@QueryMap Map<String, String> params);

    @POST("index.php/member/member_login/do_login")
    Observable<Result<LoginResultModel>> LoginWithCode(@QueryMap Map<String, String> params);

    @POST("index.php/member/member_index/set_member_mobile")
    Observable<Result<LoginResultModel>> update(@QueryMap Map<String, String> params);

    @POST("index.php/member/member_login/do_register")
    Observable<Result<LoginResultModel>> RegistWithCode(@QueryMap Map<String, String> params);

    /**
     * 验证码获取
     * @param params
     * @return
     */
    @POST("index.php/member/member_login/get_verifi_code")
    Observable<Result<CodeModel>> getLoginCode(@QueryMap Map<String, String> params);

    @POST("index.php/member/member_index/get_mobile_code")
    Observable<Result<CodeModel>> updatePone(@QueryMap Map<String, String> params);

    /**
     * 获取注册邀请码
     * @param params
     * @return
     */
    @POST("index.php/member/member_login/get_register_code")
    Observable<Result<CodeModel>> getRegistCode(@QueryMap Map<String, String> params);

    @POST("index.php/member/member_payment/member_recharge")
    Observable<Result<CodeModel>> getOrderPayNo(@QueryMap Map<String, String> params);

    @POST("index.php/member/member_payment/withdraw")
    Observable<Result<String>> getMoney(@QueryMap Map<String, String> params);

    @POST("index.php/member/member_payment/withdraw_list")
    Observable<Result<List<BankListModel>>> getMoneyList(@QueryMap Map<String, String> params);

    @POST("index.php/member/member_payment/member_income")
    Observable<Result<List<ProfitModel>>> getProfitList(@QueryMap Map<String, String> params);

    @POST("index.php/member/member_payment/recharge_list")
    Observable<Result<List<CostModel>>> getCost(@QueryMap Map<String, String> params);

    @POST("index.php/member/member_index/circle_list")
    Observable<Result<List<TieziModel>>> getTieZi(@QueryMap Map<String, String> params);

    @GET("big_shot_my_curriculum")
    Observable<Result<List<KeChengModel>>> getKecheng(@Query("token") String token, @Query("page") int page, @Query("page_count") int page_count);

    @POST("index.php/member/member_payment/payment_index")
    Observable<Result<PackageModel>> getMoneyDetail(@QueryMap Map<String, String> params);

    @POST("index.php/member/member_payment/member_vip")
    Observable<Result<CodeModel>> getVipOrderPayNo(@QueryMap Map<String, String> params);

    @POST("index.php/member/member_payment/payCharge")
    Observable<Result<WAPayNode>> pay(@QueryMap Map<String, String> params);

    @POST("index.php/member/member_payment/payMemberVip")
    Observable<Result<WAPayNode>> payVip(@QueryMap Map<String, String> params);

    @POST("index.php/member/member_index/certification")
    Observable<Result<CodeModel>> realSelf(@QueryMap Map<String, String> params);

    @POST("index.php/member/member_index/set_member_profile")
    Observable<Result<CodeModel>> setProfit(@QueryMap Map<String, String> params);

    @POST("index.php/member/member_index/set_member_name")
    Observable<Result<CodeModel>> setNickName(@QueryMap Map<String, String> params);

    @POST("index.php/member/member_index/logout")
    Observable<Result<String>> loginOut(@QueryMap Map<String, String> params);

    @POST("index.php/member/member_index/setRegistrationid")
    Observable<Result<CodeModel>> BindRegid(@QueryMap Map<String, String> params);

    @POST("index.php/member/member_index/member_invitation_url")
    Observable<Result<CodeModel>> ShareLink(@QueryMap Map<String, String> params);

    @POST("big_shot_article_comment")
    Observable<Result<List<CodeModel>>> CommentVideo(@QueryMap Map<String, String> params);

    @GET("big_shot_select_list")
    Observable<Result<List<LookHisToryModel>>> getLook( @Query("token") String token);

    @POST("index.php/member/member_index/collection_info")
    Observable<Result<List<CollectModel>>> getCollect(@QueryMap Map<String, String> params);

    @POST("index.php/member/member_index/del_collection")
    Observable<Result<CollectModel>> delCollect(@QueryMap Map<String, String> params);

    @POST("index.php/member/member_index/member_index")
    Observable<Result<UserModel>> getUserInfo(@QueryMap Map<String, String> params);

    @POST("index.php/chart/chart_index/index")
    Observable<Result<List<FriendModel>>> getFriends(@QueryMap Map<String, String> params);

    @GET("big_shot_curriculum_video_list")
    Observable<Result<List<VideoModel>>> getVideoList(@Query("category_id") String category_id);

    @GET("big_shot_video_get_detail")
    Observable<Result<VideoDetailModel>> getDetail(@Query("id") String id);

    @GET("big_shot_curriculum_video_comment")
    Observable<Result<VideoCommentlModel>> getComment(@Query("id") String id,@Query("page") String page,@Query("page_count") String page_count);

    @GET("big_shot_article_comment_list")
    Observable<Result<VideoCommentlModel>> getArticComment(@Query("id") String id,@Query("page") String page,@Query("page_count") String page_count);

    @GET("big_shot_curriculum_video_fab")
    Observable<Result<List<VideoLableModel>>> getLable();

    @POST("big_shot_video_fabulous")
    Observable<Result<List<CodeModel>>> collect(@QueryMap Map<String, String> params);
    //@Query("operation") String operation,@Query("id") String id,@Query("token") String token

    @POST("index.php/member/member_index/get_invite_url")
    Observable<Result<CodeModel>> getInviteUrl(@Query("token") String token);
    //@Query("operation") String operation,@Query("id") String id,@Query("token") String token

    @GET("index.php/index/index/get_version_info")
    Observable<Result<VersionInfo>> getVersionInfo();

    @GET("index.php/member/member_index/team_index")
    Observable<Result<List<TeamModel>>> getMyTeam(@Query("token") String token);

    @GET("index.php/member/member_index/get_relation_data")
    Observable<Result<List<TeamModel>>> getRelation(@Query("token") String token,@Query("invite_code") String invite_code);

    @GET("index/index/get_new_data")
    Observable<Result<List<NewsForCategory>>> getNewsList(@Query("type") String type);
}
